import router from "@/router";
import { useUserStore } from "@/stores/user";
import axios, { type Method } from "axios";
import { ElMessage } from "element-plus";

const service = axios.create({
  baseURL: "https://api-hmzs.itheima.net/tj",
  timeout: 10000
});

export interface ServiceResponse<T> {
  code: number;
  message: string;
  data: T;
}

/**
 * 向指定URL发送请求
 *
 * 此函数封装了一个通用的HTTP请求逻辑，支持GET和其他HTTP方法它根据请求方法动态决定
 * 如何携带提交的数据：GET请求使用查询参数形式，其他方法如POST则将数据放在请求体中
 *
 * @param url 请求的URL地址
 * @param method HTTP请求方法，默认为'GET'
 * @param submitData 要提交的数据，对于GET请求作为查询参数，对于其他请求作为请求体数据
 * @returns 返回一个Promise对象，解析为服务端响应的数据
 */
export const request = <T>(
  url: string,
  method: Method = "GET",
  submitData?: object
) => {
  return service.request<T, ServiceResponse<T>>({
    url,
    method,
    // 根据HTTP方法动态决定使用params或data属性
    [method.toUpperCase() === "GET" ? "params" : "data"]: submitData
  });
};

// 发送请求时默认携带token
service.interceptors.request.use(
  config => {
    const { token } = useUserStore();
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

service.interceptors.response.use(
  response => {
    return response.data;
  },
  error => {
    // 如果后端有返回错误信息, 就统一提示
    if (error.response) {
      ElMessage.error(error.response.data.msg);
      // 判断是否为401错误, 如果是, 清除token并跳转到登录页
      if (error.response.status === 401) {
        console.log("401");
        // 
        router.push("/login");
        useUserStore().removeToken();
      }
    } else {
      // 如果后端没有返回错误信息, 还是有错误,大概率是网络问题(断网,或超时)
      ElMessage.error("网络错误, 请检查网络是否正常");
    }
    return Promise.reject(error);
  }
);

export default service;
